# ping(8) completion                                       -*- shell-script -*-

_ping()
{
    local cur prev words cword
    _init_completion -n = || return

    local ipvx

    case $prev in
        -*[cFGghilmPpstVWwz])
            return
            ;;
        -*I)
            _available_interfaces -a
            return
            ;;
        -*M)
            # Path MTU strategy in Linux, mask|time in FreeBSD
            local opts="do want dont"
            [[ $OSTYPE == *bsd* ]] && opts="mask time"
            COMPREPLY=($(compgen -W '$opts' -- "$cur"))
            return
            ;;
        -*N)
            if [[ $cur != *= ]]; then
                COMPREPLY=($(compgen -W 'name ipv6 ipv6-global ipv6-sitelocal
                    ipv6-linklocal ipv6-all ipv4 ipv4-all subject-ipv6=
                    subject-ipv4= subject-name= subject-fqdn=' -- "$cur"))
                [[ ${COMPREPLY-} == *= ]] && compopt -o nospace
            fi
            return
            ;;
        -*Q)
            # TOS in Linux, "somewhat quiet" (no args) in FreeBSD
            if [[ $OSTYPE != *bsd* ]]; then
                COMPREPLY=($(compgen -W '{0..7}' -- "$cur"))
                return
            fi
            ;;
        -*S)
            # Socket sndbuf in Linux, source IP in FreeBSD
            [[ $OSTYPE == *bsd* ]] && _ip_addresses
            return
            ;;
        -*T)
            # Timestamp option in Linux, TTL in FreeBSD
            [[ $OSTYPE == *bsd* ]] ||
                COMPREPLY=($(compgen -W 'tsonly tsandaddr' -- "$cur"))
            return
            ;;
        -*4*)
            ipvx=-4
            ;;
        -*6*)
            ipvx=-6
            ;;
    esac

    if [[ $cur == -* ]]; then
        COMPREPLY=($(
            compgen -W '$(_parse_help "$1" || _parse_usage "$1")' -- "$cur"
        ))
        return
    fi

    [[ $1 == *6 ]] && ipvx=-6
    _known_hosts_real ${ipvx-} -- "$cur"
} &&
    complete -F _ping ping ping6

# ex: filetype=sh
